/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xilinx;

/**
 *
 * @author dani
 */
public class OperacionesAritmeticas {
    
    public OperacionesAritmeticas()
    {
        
    }
    
    public long cambioBase( String valor, String cadena, int limite) throws Exception
    {
        try
        {
           boolean signo; //true positivo, false negativo 
           if(cadena.equals(""))
        	   return 0;
           char signo2= cadena.charAt(0);
           double maximo=Math.pow(2, limite);
           int potencia=obtenerPotencia(valor);
            if(cadena.length()<2 &&  potencia!=10)
               throw new Exception("El numero en representacion en complemento necesita al menos dos digitos");
        
            //Caso de decimal ya esta transformado
           if(potencia == 10)
           {
               if(Math.pow(2, limite)>Long.parseLong(cadena, potencia) &&(-1)*Math.pow(2, limite)<Long.parseLong(cadena, potencia) )
                 return  Long.parseLong(cadena, potencia);
               else
                  throw new Exception("la cadena de digitos sobrepasa el limite establecido para dicho registro"); 
           }
        //Caso de binario hay que transformalos a sistema decimal tener en cuenta que esta en sitema complemento a dos    
          if(potencia == 2)
          {
                if (signo2=='1')
                    signo=true;
                else
                    if (signo2=='0')
                         signo=false;
                    else
                         throw new Exception("El primer digito del numero tiene que corresponder con el signo");
                for(int i=0;i<cadena.length();i++) //comprobamos que la cadena esta formada por 0s y 1s 
                {
                    if(cadena.charAt(i)=='0' || cadena.charAt(i)=='1' )
                        continue;
                    else
                         throw new Exception("Los caracteres introducidos no corresponde con valores binarios"); 
                }  
                if(Math.pow(2, limite)>Long.parseLong(cadena, potencia) &&(-1)*Math.pow(2, limite)<Long.parseLong(cadena, potencia) )
                    if(!signo)
                        return ( Long.parseLong(cadena, potencia));
                    else //lo convertimos a complemento a dos
                     {
                        return ( -Long.parseLong(complementoADos(cadena), potencia));
                     }
                else
                  throw new Exception("la cadena de digitos sobrepasa el limite establecido para dicho registro");   
            }  

       //Caso de Hexadecimal hay que transformalos a sistema decimal tener en cuenta que esta en sitema complemento  
         if(potencia == 16)
           {
                if (signo2=='F')
                    signo=true;
                else
                    if(signo2=='0')
                        signo=false;
                    else
                        throw new Exception("El primer digito del numero tiene que corresponder con el signo");

                for(int i=0;i<cadena.length();i++)     
                {
                    if(cadena.charAt(i)=='0' || cadena.charAt(i)=='1'|| cadena.charAt(i)=='2'|| cadena.charAt(i)=='3'
                        || cadena.charAt(i)=='4' || cadena.charAt(i)=='5'|| cadena.charAt(i)=='6'|| cadena.charAt(i)=='7'
                        || cadena.charAt(i)=='8' || cadena.charAt(i)=='9'|| cadena.charAt(i)=='a'|| cadena.charAt(i)=='A'
                        || cadena.charAt(i)=='b' || cadena.charAt(i)=='B'|| cadena.charAt(i)=='c'|| cadena.charAt(i)=='C'
                        || cadena.charAt(i)=='e' || cadena.charAt(i)=='E'|| cadena.charAt(i)=='f'|| cadena.charAt(i)=='F')
                            continue;
                    else
                            throw new Exception("Los caracteres introducidos no corresponde con valores en representaciÃ³n hexadecimal"); 
                }  
                if(Math.pow(2, limite )>Long.parseLong(cadena, potencia) &&(-1)*Math.pow(2, limite)<Long.parseLong(cadena, potencia) )
                    if(signo)
                        return ( Long.parseLong(cadena, potencia));
                    else //lo convertimos a complemento a dos
                    {
                        String subcadena=cadena.substring(1,cadena.length());
                        return ( -Long.parseLong(subcadena, potencia)-1);
                    }
                else
                  throw new Exception("la cadena de digitos sobrepasa el limite establecido para dicho registro"); 
            }  
          }
        catch(Exception e)
        {
            System.err.println(e.toString());
        }
        return 0;
    }
       
    public String complementoADos(String cadena)
    {
        String solucion2="";
        boolean encontrado=false;
        for(int i=cadena.length()-1;i>=0;i--)
        {
            if(encontrado)
            {
                if(cadena.charAt(i)=='1')
                    solucion2="0"+""+solucion2;
                else
                    solucion2="1"+""+solucion2;
            }
            else
            {
                if(cadena.charAt(i)=='1' && !encontrado)
                {
                    encontrado=true;
                    solucion2="1"+""+solucion2;
                }   
                if(cadena.charAt(i)=='0' && !encontrado)  
                  solucion2="0"+""+solucion2;
            }
        }
        return solucion2;
    
    }
    
    public int obtenerPotencia(String valor)
    {
        int potencia=0;
            switch(valor)
            {
                case "Hexadecimal":{potencia=16; break;}
                case "Binario":{potencia=2; break;}
                case "Decimal":{potencia=10; break;}
            }
            return potencia;
    }
    
    public String pasarDecimalBinario(String valor, int num)
    {
    	Integer r=Integer.parseInt(valor);
        String s=r.toBinaryString(r);
        int longitud=s.length();
        String aux="";     
        for(int i=0; i<num-longitud;i++)
        {
                if(r<0)
                     aux+="1";
                else
                     aux+="0";
        }
        s=aux+s;
        return s;
    }
    
}
